/**
 * 表单处理模块
 * 用于从AI回复中提取表单数据并发送到iframe
 */
const FormHandler = (function() {
    // 私有变量
    let formContainer = null;
    let formIframe = null;
    let currentFormData = {};
    let formVisible = false;
    
    // 私有方法
    
    /**
     * 生成请假单号
     * @returns {string} 生成的请假单号
     */
    function generateNo() {
        const now = new Date();
        const year = now.getFullYear();
        const month = String(now.getMonth() + 1).padStart(2, '0');
        const day = String(now.getDate()).padStart(2, '0');
        const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
        return `QJ${year}${month}${day}${random}`;
    }
    
    /**
     * 从文本中提取表单数据
     * @param {string} text - 包含表单数据的文本
     * @returns {Object|null} 提取的表单数据或null
     */
    function extractFormData(text) {
        if (!text) return null;
        
        // 使用正则表达式提取<user-form>标签中的内容
        const regex = /<user-form>([\s\S]*?)<\/user-form>/;
        const match = text.match(regex);
        
        if (!match || !match[1]) {
            console.log('未找到表单数据');
            return null;
        }
        
        try {
            // 尝试解析JSON数据
            const formContent = match[1].trim();
            
            // 检查是否已经是JSON对象
            if (formContent.startsWith('{') && formContent.endsWith('}')) {
                return JSON.parse(formContent);
            }
            
            // 如果不是标准JSON格式，尝试提取最后一个JSON对象
            const jsonRegex = /{[\s\S]*?}/g;
            const jsonMatches = formContent.match(jsonRegex);
            
            if (jsonMatches && jsonMatches.length > 0) {
                // 取最后一个匹配的JSON对象
                const lastJson = jsonMatches[jsonMatches.length - 1];
                return JSON.parse(lastJson);
            }
            
            console.log('未能解析表单数据');
            return null;
        } catch (error) {
            console.error('解析表单数据失败:', error);
            return null;
        }
    }
    
    /**
     * 发送表单数据到iframe
     * @param {Object} formData - 要发送的表单数据
     */
    function sendFormData(formData) {
        if (!formIframe || !formIframe.contentWindow) {
            console.error('表单iframe未准备好');
            return;
        }
        
        // 默认表单数据
        const defaultData = {
            no: generateNo(),
            name: '张三',
            employeeId: 'EMP' + Math.floor(Math.random() * 10000).toString().padStart(4, '0'),
            department: '技术部',
            groupName: '前端开发组',
            level: 'P6',
            shift: '标准班',
            leaveType: '年假',
            workAgent: '李四',
            reason: '家庭旅行',
            plannedStartTime: new Date(Date.now() + 86400000).toISOString(), // 明天
            plannedEndTime: new Date(Date.now() + 86400000 * 5).toISOString(), // 5天后
            plannedDays: 5,
            plannedHours: 40,
            actualStartTime: new Date(Date.now() + 86400000).toISOString(),
            actualEndTime: new Date(Date.now() + 86400000 * 5).toISOString(),
            actualDays: 5,
            actualHours: 40,
            applicant: '张三',
            groupApproval: '待审批',
            departmentSupervisorApproval: '待审批',
            departmentManagerApproval: '待审批',
            directorApproval: '待审批',
            generalManagerApproval: '',
            presidentApproval: '',
            managementDepartmentApproval: ''
        };
        
        // 合并数据，优先使用传入的数据
        const dataToSend = { ...defaultData, ...formData };
        
        // 更新当前表单数据
        currentFormData = { ...dataToSend };
        
        try {
            // 使用iframe的源作为目标源
            const targetOrigin = new URL(formIframe.src).origin;
            console.log('发送消息到:', targetOrigin, dataToSend);
            
            // 发送消息到iframe
            formIframe.contentWindow.postMessage(dataToSend, targetOrigin);
            
            // 显示表单容器
            showFormContainer();
            
            return true;
        } catch (error) {
            console.error('发送表单数据失败:', error);
            return false;
        }
    }
    
    /**
     * 显示表单容器
     */
    function showFormContainer() {
        if (!formContainer) return;
        
        formContainer.style.display = 'block';
        formVisible = true;
        
        // 触发自定义事件
        const event = new CustomEvent('formVisibilityChanged', { detail: { visible: true } });
        document.dispatchEvent(event);
    }
    
    /**
     * 隐藏表单容器
     */
    function hideFormContainer() {
        if (!formContainer) return;
        
        formContainer.style.display = 'none';
        formVisible = false;
        
        // 触发自定义事件
        const event = new CustomEvent('formVisibilityChanged', { detail: { visible: false } });
        document.dispatchEvent(event);
    }
    
    // 公共API
    return {
        /**
         * 初始化表单处理模块
         * @param {Object} options - 配置选项
         * @param {HTMLElement} options.container - 表单容器元素
         * @param {HTMLIFrameElement} options.iframe - 表单iframe元素
         * @param {string} options.iframeSrc - iframe的源URL
         */
        init: function(options) {
            // 创建表单容器
            if (!options.container) {
                formContainer = document.createElement('div');
                formContainer.className = 'form-container';
                formContainer.style.cssText = 'display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80%; height: 80%; background: white; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 1000; overflow: hidden;';
                document.body.appendChild(formContainer);
            } else {
                formContainer = options.container;
            }
            
            // 创建iframe
            if (!options.iframe) {
                formIframe = document.createElement('iframe');
                formIframe.style.cssText = 'width: 100%; height: 100%; border: none;';
                formIframe.src = options.iframeSrc || 'http://192.168.110.16:8080/main/renshi/kaoqing/qingjia';
                formContainer.appendChild(formIframe);
            } else {
                formIframe = options.iframe;
                if (options.iframeSrc) {
                    formIframe.src = options.iframeSrc;
                }
            }
            
            // 创建关闭按钮
            const closeButton = document.createElement('button');
            closeButton.textContent = '关闭表单';
            closeButton.style.cssText = 'position: absolute; top: 10px; right: 10px; padding: 5px 10px; background: #f44336; color: white; border: none; border-radius: 4px; cursor: pointer;';
            closeButton.addEventListener('click', this.hideForm);
            formContainer.appendChild(closeButton);
            
            console.log('表单处理模块已初始化');
        },
        
        /**
         * 处理消息内容，提取并处理表单数据
         * @param {string} messageContent - 消息内容
         * @returns {boolean} 是否成功处理了表单数据
         */
        processMessage: function(messageContent) {
            // 确保输入是字符串
            if (typeof messageContent !== 'string') {
                console.error('消息内容不是字符串类型');
                return false;
            }
            
            // 提取表单数据
            const formData = extractFormData(messageContent);
            if (formData) {
                console.log('成功提取表单数据:', formData);
                return sendFormData(formData);
            }
            
            console.log('消息中没有有效的表单数据');
            return false;
        },
        
        /**
         * 显示表单
         */
        showForm: function() {
            showFormContainer();
        },
        
        /**
         * 隐藏表单
         */
        hideForm: function() {
            hideFormContainer();
        },
        
        /**
         * 切换表单显示状态
         */
        toggleForm: function() {
            if (formVisible) {
                hideFormContainer();
            } else {
                showFormContainer();
            }
        },
        
        /**
         * 获取当前表单数据
         * @returns {Object} 当前表单数据
         */
        getCurrentFormData: function() {
            return { ...currentFormData };
        },
        
        /**
         * 手动发送表单数据
         * @param {Object} formData - 要发送的表单数据
         */
        sendData: function(formData) {
            return sendFormData(formData);
        },
        
        /**
         * 检查消息是否包含表单数据
         * @param {string} messageContent - 消息内容
         * @returns {boolean} 是否包含表单数据
         */
        hasFormData: function(messageContent) {
            return /<user-form>[\s\S]*?<\/user-form>/.test(messageContent);
        }
    };
})();